from django import http
from django.contrib.auth import login
from django.http import HttpResponse
from django.shortcuts import render, redirect

# Create your views here.
from django.urls import reverse
from django.views import View

from apps.users.models import User


class RegisterView(View):

    def get(self,request):
        return render(request,'register.html')

    """
      一.把需求写下来

          前端: 收集 用户名,密码,确认密码,手机号
          后端: 实现注册

      二.详细分析后端逻辑

          1. 先接收数据
          2. 验证数据 (做后端开发的 不相信前端提交的任何数据)
          3. 数据入库
          4. 返回相应

      三.确定请求方式和路由
          POST    /register
      """

    """
    需求分析如何分析呢?
        我们需要借助于产品给我们的原型进行分析


            1. 先接收数据
            2. 验证数据 (做后端开发的 不相信前端提交的任何数据)
                2.1 先验证必传数据(如果缺少任何一个,那就别验证)
                2.2 验证用户名是否符合规则
                2.3 验证密码是否符合规则
                2.4 验证确认密码和密码是否一致
                2.5 验证手机号
            3. 数据入库
            4. 返回相应

        """

    def post(self,request):
        # 1. 先接收数据
        data = request.POST
        username=data.get('username')
        password=data.get('password')
        password2=data.get('password2')
        mobile=data.get('mobile')

        # 2. 验证数据 (做后端开发的 不相信前端提交的任何数据)
        # 2.1 先验证必传数据(如果缺少任何一个,那就别验证)
        # 如果all中的变量有一个为 None/False 则 all返回 False
        if not all([username,password2,password,mobile]):
            return http.HttpResponseBadRequest('参数缺失')

        # 2.2 验证用户名是否符合规则  5-20个字符,字母,数字,_
        import re
        if not re.match(r'[a-zA-Z0-9_-]{5,20}',username):
            return http.HttpResponseBadRequest('用户名不符合规则')
        # 2.3 验证密码是否符合规则
        if not re.match(r'[0-9A-Za-z]{8,20}',password):
            return http.HttpResponseBadRequest('密码不符合规则')
        # 2.4 验证确认密码和密码是否一致
        if password != password2:
            return http.HttpResponseBadRequest('密码不一致')
        # 2.5 验证手机号
        if not re.match(r'1[3-9]\d{9}',mobile):
            return http.HttpResponseBadRequest('手机号不符合规则')
        # 3. 数据入库
        # 如果我们使用基础学习的模型保存 密码没有加密
        # 我们可以直接调用 系统的方法来完成密码加密 create_user
        try:
            user = User.objects.create_user(username=username,
                                        password=password,
                                        mobile=mobile)
        except Exception as e:
            import logging
            logger=logging.getLogger('django')
            logger.error(e)

        # 添加方法保持登陆状态
        login(request,user)
        # 4. 返回相应
        # 注册成功直接跳转到首页
        print('a')
        # return redirect(reverse('contents:index'))
        return redirect(reverse('contents:index'))
        # return HttpResponse('注册成功')




"""
一.把需求写下来
    作为用户会干什么:   输入完用户名之后,会输入密码
    前端收集什么数据:   当光标失去焦点之后,获取到用户名,将用户名提交给后端
    后端实现什么功能:   接收这个用户名,根据用户名进行查询
                        如果查询的结果数量为1 说明存在
                        如果查询的结果数量为0 说明不存在

二.详细分析后端逻辑
用户名重复
    1.接收这个用户名
    2.根据用户名进行查询,获取数量
    3.返回数据

三.确定请求方式和路由
    GET     register/count/?username=xxxxx
            usernames/(?P<username>[a-zA-Z0-9_-]{5,20})/count/                    v

    POST    register/count/
"""
from django.http import JsonResponse
from django import http
class UsernameCountView(View):

    def get(self,request,username):
        # 1.接收这个用户名
        # 2.根据用户名进行查询,获取数量
        #如果查询的结果数量为1 说明存在
        # 如果查询的结果数量为0 说明不存在
        count=User.objects.filter(username=username).count()
        # 3.返回数据
        return http.JsonResponse({'code':0,'errmsg':'ok','count':count})


# 手机号是否注册过
from django.http import JsonResponse
from django import http
class MobileCountView(View):

    def get(self,request,mobile):
        # 1.接收这个用户名
        # 2.根据用户名进行查询,获取数量
        #如果查询的结果数量为1 说明存在
        # 如果查询的结果数量为0 说明不存在
        count=User.objects.filter(mobile=mobile).count()
        # 3.返回数据

        return http.JsonResponse({'code':0,'errmsg':'ok','count':count})







